#ifndef DRIVER_AXI_SRIO_AXISRIO_H_
#define DRIVER_AXI_SRIO_AXISRIO_H_

#ifdef __cplusplus
extern "C" {
#endif

#define AXI_SRIO_NAME       "axiSrioDrv"
#define AXI_SRIO_UNIT       (0)
// 中断控制寄存器定义
#define FPGA_RESET_REG         0x0000   // 复位寄存器
#define FPGA_TEST_INT_REG      0x0004   // 测试中断寄存器
#define FPGA_INT_STATUS_REG    0x0008   // 中断状态/清除寄存器
#define FPGA_INT_ENABLE_REG    0x000C   // 中断使能寄存器
#define FPGA_INT_TYPE_REG      0x0010   // 中断类型寄存器
#define FPGA_INT_POLARITY_REG  0x0014   // 中断极性寄存器
#define FPGA_OUTPUT_LEVEL_REG  0x0018   // 输出电平寄存器
#define FPGA_PULSE_WIDTH_REG   0x001C   // 输出脉宽寄存器
#define FPGA_GLOBAL_ENABLE_REG 0x0024   // 全局中断使能寄存器
#define FPGA_EDGE_DETECT_REG   0x0028   // 边沿触发寄存器

// 复位寄存器值
#define FPGA_RESET_VALUE       0xA    // 写入0xA时复位

// 寄存器位定义
#define FPGA_INT_BIT(n)        (1U << (n))  // 第n位中断控制位

// 中断类型
#define FPGA_INT_TYPE_LEVEL    1      // 电平触发
#define FPGA_INT_TYPE_EDGE     0      // 边沿触发

// 中断极性
#define FPGA_INT_POL_RISING    1      // 上升沿/高电平触发
#define FPGA_INT_POL_FALLING   0      // 下降沿/低电平触发

// 输出电平
#define FPGA_OUT_LOW_IDLE      0      // 空闲低电平，中断高电平
#define FPGA_OUT_HIGH_IDLE     1      // 空闲高电平，中断低电平

// 全局中断使能
#define FPGA_GLOBAL_INT_ENABLE 0x1    // 全局中断使能位

 
#define SRIO_TX_ADDR_REG       0x10004   // 发送起始地址寄存器
#define SRIO_DOORBELL_CFG_REG  0x10008   // 发送门铃设置寄存器
#define SRIO_CTRL_REG          0x10040   // 收发控制寄存器

// 门铃设置寄存器位定义
#define SRIO_DOORBELL_TLAST_EN  (1 << 0)  // TLAST标志插入门铃包
#define SRIO_DOORBELL_MSG_MASK  (0xFFFF << 16) // 门铃MSG位域

// 收发控制寄存器位定义
#define SRIO_TX_ENABLE         (1 << 0)  // 发送使能
#define SRIO_RX_ENABLE         (1 << 1)  // 接收使能 
#define SRIO_RX_DOORBELL_LAST  (1 << 2) // 接收门铃产生last使能
#define SRIO_NWRITE_ENABLE     (1 << 3) // Nwrite使能
#define SRIO_ADDR_PASSTHROUGH  (1 << 4) // 数据地址透传使能
#define SRIO_MSG_PASSTHROUGH   (1 << 5) // 门铃信息透传使能
#define SRIO_DESTID_PASSTHROUGH (1 << 6) // 目标ID透传使能



typedef struct srio_drv_ctrl {
    VXB_DEV_ID  srioDev;
    void *      srioBar;
    void *      srioHandle;
    SEM_ID      srioSem;
    PHYS_ADDR   srioPhyBar;


    void *      srioMem; 
    PHYS_ADDR   srioMemPhyBar;

    
	VXB_RESOURCE *      intRes;


    VXB_DEV_ID  admaDev;
    void        (*isr)(void * pArg);
} SRIO_DRV_CTRL;

#define SRIO_BAR(pDev)      (((SRIO_DRV_CTRL *)vxbDevSoftcGet(pDev))->srioBar)
#define SRIO_HANDLE(pDev)   (((SRIO_DRV_CTRL *)vxbDevSoftcGet(pDev))->srioHandle)


#undef CSR_READ_4
#define CSR_READ_4(pDev, addr)                                  \
    vxbRead32 (SRIO_HANDLE(pDev), (UINT32 *)((char *)SRIO_BAR(pDev)+((UINT32)(addr))))

#undef CSR_WRITE_4
#define CSR_WRITE_4(pDev, addr, data)                           \
    vxbWrite32 (SRIO_HANDLE(pDev),                             \
        (UINT32 *)((char *)SRIO_BAR(pDev)+((UINT32)(addr))), data)
 
 
#ifdef __cplusplus
}
#endif

#endif /* DRIVER_AXI_SRIO_AXISRIO_H_ */
